//1\高阶函数-函数作为参数
function forEach(arr,fn) {
  for(var i=0;i<arr.length;i++){
    fn(arr[i])
  }
}

//测试
var arr=[1,3,4,6,7,8];
// forEach(arr,function (item) {
//   console.log(item);
// })
// var res=filter(arr,function (item) {
//   return item % 2===0
// });
// console.log(res);

function filter(arr,fn) {
  var results=[]
  for(var i=0;i<arr.length;i++){
    if(fn(arr[i])){
      results.push(arr[i]);
    }
  }
  return results;
}

// 2\ 高阶函数-函数作为返回值
function makeFn() {
  var msg="hello world";
  return function () {
    console.log(msg);
  }
}

// var fn=makeFn();
// fn();
// makeFn()();

// once
function once(fn) {
  var done=false;
  return function () {
    if(!done){
      done=true;
      return fn.apply(this,arguments);
    }
  }
}

// var pay =once(function (money) {
//   console.log(`支付：${money}元`);
// })

// pay(3);
// pay(3);

// 模拟常用高阶函数

// map
const map=(array,fn)=>{
  let result=[];
  for(let item of array){
    result.push(fn(item));
  }
  return result;
}

// test
// let pow=map(arr,function (v) {
//   return v*v;
// });
// console.log(pow)

// every
const every = (array,fn)=>{
  let result=true;
  for(let value of array){
    result=fn(value)
    if(!result){
      break;
    }
  }
  return result;
}

// test
// var event=every(arr,v=>v%2==0);
// console.log(event)

// some
const some = (array, fn) =>{
  let res=false;
  for(let v of array){
    res=fn(v);
    if(res){
      break;
    }
  }
  return res;
}

// test
let any=some(arr,v=>v%2==0);
console.log(any)